/* -------------------------------------------------------------------------
 *
 * pg_subscription_rel.h
 *	  定义包含每个订阅中每个复制表状态的系统目录 (pg_subscription_rel)
 *
 * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
 * Portions Copyright (c) 1994, Regents of the University of California
 *
 * src/include/catalog/pg_subscription_rel.h
 *
 * NOTES
 *	  Catalog.pm 模块读取此文件并推导模式信息。
 *
 * -------------------------------------------------------------------------
 */
#ifndef PG_SUBSCRIPTION_REL_H
#define PG_SUBSCRIPTION_REL_H

#include "access/xlogdefs.h"
#include "catalog/genbki.h"
#include "catalog/pg_subscription_rel_d.h"
#include "nodes/pg_list.h"

/* ----------------
 *		pg_subscription_rel定义。cpp将其转换为
 *		typedef struct FormData_pg_subscription_rel
 * ----------------
 */
CATALOG(pg_subscription_rel,6102,SubscriptionRelRelationId)
{
	Oid			srsubid BKI_LOOKUP(pg_subscription);	/* 订阅的Oid */
	Oid			srrelid BKI_LOOKUP(pg_class);	/* 关系的Oid */
	char		srsubstate;		/* 订阅中关系的状态 */

	/*
	 * 虽然srsublsn是固定宽度类型，但允许为NULL，因此
	 * 我们防止直接C代码访问它，正如对varlena字段一样。
	 */
#ifdef CATALOG_VARLEN			/* 可变长度字段从这里开始 */

	XLogRecPtr	srsublsn BKI_FORCE_NULL;	/* 状态更改的远程 LSN
											 * 用于同步
											 * 协调，或者如果无效则为 NULL */
#endif
} FormData_pg_subscription_rel;

typedef FormData_pg_subscription_rel *Form_pg_subscription_rel;

DECLARE_UNIQUE_INDEX_PKEY(pg_subscription_rel_srrelid_srsubid_index, 6117, SubscriptionRelSrrelidSrsubidIndexId, on pg_subscription_rel using btree(srrelid oid_ops, srsubid oid_ops));

#ifdef EXPOSE_TO_CLIENT_CODE

/* ----------------
 *		子状态常量
 * ----------------
 */
#define SUBREL_STATE_INIT		'i' /* 初始化中（sublsn为NULL） */
#define SUBREL_STATE_DATASYNC	'd' /* 数据正在同步中（sublsn
									 * NULL） */
#define SUBREL_STATE_FINISHEDCOPY 'f'	/* 表同步复制阶段已完成
										 * （sublsn为NULL） */
#define SUBREL_STATE_SYNCDONE	's' /* 在应用之前同步完成
									 * （sublsn已设置） */
#define SUBREL_STATE_READY		'r' /* 就绪（sublsn已设置） */

/* 这些从不存储在目录中，我们仅在IPC中使用它们。 */
#define SUBREL_STATE_UNKNOWN	'\0'	/* 未知状态 */
#define SUBREL_STATE_SYNCWAIT	'w' /* 等待同步 */
#define SUBREL_STATE_CATCHUP	'c' /* 赶上应用 */

#endif							/* EXPOSE_TO_CLIENT_CODE */

typedef struct SubscriptionRelState
{
	Oid			relid;
	XLogRecPtr	lsn;
	char		state;
} SubscriptionRelState;

extern void AddSubscriptionRelState(Oid subid, Oid relid, char state,
									XLogRecPtr sublsn);
extern void UpdateSubscriptionRelState(Oid subid, Oid relid, char state,
									   XLogRecPtr sublsn);
extern char GetSubscriptionRelState(Oid subid, Oid relid, XLogRecPtr *sublsn);
extern void RemoveSubscriptionRel(Oid subid, Oid relid);

extern bool HasSubscriptionRelations(Oid subid);
extern List *GetSubscriptionRelations(Oid subid);
extern List *GetSubscriptionNotReadyRelations(Oid subid);

#endif							/* PG_SUBSCRIPTION_REL_H */
